package com.example.satokendemo.controller;

import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.annotation.SaMode;
import cn.dev33.satoken.stp.StpUtil;
import com.example.satokendemo.dao.userMapper;
import com.example.satokendemo.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * TODO
 *
 * @ClassName UserController
 * @Author xiaojiang
 * @Date 2021/11/19 下午 12:19
 */
@RestController
public class UserController {

    @Autowired
    userMapper userMapper;

    // 测试登录，浏览器访问： http://localhost:8080/doLogin?username=zhang&password=123456
    @RequestMapping("/doLogin")
    public String doLogin(String username, String password) {
        // 此处仅作模拟示例，真实项目需要从数据库中查询数据进行比对
        String s = userMapper.selectOneUserId(username,password);
        if (s!=null){
            // 设置登录账号id为10001，第二个参数指定是否为[记住我]，当此值为false后，关闭浏览器后再次打开需要重新登录
            //StpUtil.login(10001, false);
            StpUtil.login(s);
            String tokenValue = StpUtil.getTokenInfo().tokenValue;
            return "登录成功,tokenInfo = " + tokenValue;
        }
        /*if("zhang".equals(username) && "123456".equals(password)) {
            // 标记当前会话登录的账号id
            // 建议的参数类型：long | int | String， 不可以传入复杂类型，如：User、Admin等等
            StpUtil.login(10001);
            return "登录成功";
        }*/
        return "登录失败";
    }

    // 查询登录状态，浏览器访问： http://localhost:8080/isLogin
    @RequestMapping("/isLogin")
    public String isLogin() {
        // 获取当前会话账号id, 如果未登录，则抛出异常：`NotLoginException`
        int loginIdAsInt = StpUtil.getLoginIdAsInt();
        // 获取当前会话是否已经登录，返回true=已登录，false=未登录
        return "loginIdAsInt" + loginIdAsInt +"--当前会话是否登录：" + StpUtil.isLogin();
    }

    // 查询登录状态，浏览器访问： http://localhost:8080/logout
    // 登录认证：只有登录之后才能进入该方法
    @SaCheckLogin
    @RequestMapping("/logout")
    public String logout() {
        // 当前会话注销登录
        StpUtil.logout();
        return "当前会话已退出";
    }

    // 角色认证：必须具有指定角色才能进入该方法
    @SaCheckRole(value = {"admin", "manager"}, mode = SaMode.OR)
    @RequestMapping("/selectAllUser")
    public List<User> selectAllUser() {
        // 校验：当前账号是否含有指定角色标识, 如果验证未通过，则抛出异常: NotRoleException
        //StpUtil.checkRole("admin");

        List<User> users = userMapper.selectAllUser();
        return users;
    }

    @RequestMapping("/test")
    public String test() {
        // 校验：当前账号是否含有指定角色标识, 如果验证未通过，则抛出异常: NotRoleException
        //StpUtil.checkRole("admin");

        //List<User> users = userMapper.selectAllUser();
        return "OK";
    }


}
